#include "Buffer.h"
#include "Excepciones.h"

namespace Toolkit
{

Buffer::Buffer(const unsigned long int tamanoUnidad,
        const TipoSerializacion &tserializacion) :
    Almacenamiento(tamanoUnidad, tserializacion)
{
    if (tserializacion == BINARIO)
    {
        stream = new stringstream(ios_base::in | ios_base::out
                | ios_base::binary);
    }
    else if (tserializacion == TEXTO)
    {
        stream = new stringstream(ios_base::in | ios_base::out);
    }

    offsetElementos = 0;

    this->tamanoUnidadPrimera = tamanoUnidad;
    this->cantidadUnidades = 0;
}

Buffer::Buffer(const unsigned long int tamanoUnidad,
        const TipoSerializacion &tserializacion,
        const unsigned long int tamanoUnidadPrimera) :
    Almacenamiento(tamanoUnidad, tserializacion)
{
    if (tserializacion == BINARIO)
    {
        stream = new stringstream(ios_base::in | ios_base::out
                | ios_base::binary);
    }
    else if (tserializacion == TEXTO)
    {
        stream = new stringstream(ios_base::in | ios_base::out);
    }

    offsetElementos = 0;

    this->tamanoUnidadPrimera = tamanoUnidadPrimera;

    this->cantidadUnidades = 0;
}

Buffer::Buffer(const unsigned long int cantidadUnidades,
        const unsigned long int tamanoUnidad,
        const TipoSerializacion & tserializacion) :
    Almacenamiento(tamanoUnidad, tserializacion)
{
    if (tserializacion == BINARIO)
    {
        stream = new stringstream(ios_base::in | ios_base::out
                | ios_base::binary);
    }
    else if (tserializacion == TEXTO)
    {
        stream = new stringstream(ios_base::in | ios_base::out);
    }

    offsetElementos = 0;

    this->tamanoUnidadPrimera = tamanoUnidad;
    this->cantidadUnidades = cantidadUnidades;
    this->elementos = cantidadUnidades;

    for (unsigned long int i = 0; i < cantidadUnidades; i++)
    {
        this->espacios.push_back(i);
    }
}

Buffer::~Buffer()
{
    delete stream;
}

unsigned long int Buffer::guardarDato (const stringstream &serializacion)
{
	if ((this->cantidadUnidades != 0) && (this->espacios.size() == 0)) {
		throw BufferOverflowException();
	}

	return Almacenamiento::guardarDato(serializacion);
}

}
